#ifndef _MBBUS_H
#define _MBBUS_H

#include "main.h"
#ifdef __cplusplus
PR_BEGIN_EXTERN_C
#endif
/***************************************************************************
//2022-
0105:
1.中继设备
***************************************************************************/

#define PHY_DEV_IP101     1
#define PHY_DEV_88E6320   2
#define USE_PHY_DEV       PHY_DEV_88E6320
/*********** 程序版本号设置 **********/
#define CAR_YEAR   (2022 -2020)
#define CAR_MONTH   10
#define CAR_DAY     8
#define CAR_SOFE    0

#define CAR_VERSION   ((CAR_YEAR*12+CAR_MONTH)*1000+(CAR_DAY*10)+CAR_SOFE)
/***************************************************************************

***************************************************************************/
#define TICK_S(N)  					(N * 1000)
#define TICK_M(N)  					(N * TICK_S(60) )
#define FUN_ENABLE                	0
#define FUN_DISABLE               	1

/***********串口1打印调试使能**********/
#define  TEST_DEBUG  1
/***********开启以太网使能*************/
#define  ETH_LWIP_ENABLE     FUN_ENABLE

/***********开门狗使能*****************/
#define USE_DOG_ENABLE        FUN_DISABLE//FUN_ENABLE//FUN_DISABLE
/***********TFTP升级使能*****************/
#define USE_IAP_TFTP          FUN_DISABLE
/***********是否升级程序选择**********/
#define SOFT_0X00000           0X00000                /*正常下载程序*/
#define SOFT_0X20000           0X20000                /*远程升级程序*/

#define  FLASH_BASE_OFFSET  SOFT_0X00000

/***********设备类型定义**********/
#define CAR_TYPE_ZNPX          1   //智能配线
#define CAR_TYPE_DMOIP_4E1     2   //反4E1协转

#define CAR_USE_TYPE     CAR_TYPE_DMOIP_4E1
/*************************************************

**************************************************/
#define IAP_NAME_LEN  16
#define IAP_BIN_NAME  "dmoip_4E1-sjkj"


/*********** 参数设置设置 **********/
#define  UDP_COMM_SERVER    		1 		// UDP局端是服务器
#define  UDP_COMM_CLINET      		2  		// UDP局端是客服端

#define  USE_UDP_TYPE 			UDP_COMM_CLINET		// UDP使用

//主卡最多连接设备数量
#if DEV_MULT_NUM	//有中继设备
#define  FRAM_MIN_LEN		64	//tcp帧最小长度
#define  SYS_MAX_CARD      (DEV_MULT_START_ADD + DEV_MULT_NUM * DEV_MULT_PORT)
#else
#define  FRAM_MIN_LEN		32	//tcp帧最小长度
#define  SYS_MAX_CARD   	MAIN_CARD_PORT
#endif

#define  CARD_MAX_PORT   	24									//小卡最大端口数
#define  CARD_PARA_LEN     	32									//1个小卡参数长度
#define  SYSPARA_MAX_LEN  	CARD_PARA_LEN						//系统参数
#define  CARDPARA_ALL_LEN   (SYS_MAX_CARD * CARD_PARA_LEN)		//所有小卡接收参数

#define  ONESTR_MAX_LEN    	50  //一个字符串最大长度
#define  ONESTR_MIN_LEN    	7  //一个字符串最小长度
#define  ONEPORT_MAX_STR  	5  //一个节点最多保存字符串个数

#define  CARD_RESET_FLAG  	0XAA55
#define  CARD_SET_NUM     	0x20
/*********** 网络设置设置 **********/
#define  TCP_SAVE_STM32  	//保存在芯片flash
#define	 TCP_RUN_PORT		503
#define  TCP_IP_ADD      	2
#define  TCP_MASK_ADD    	6
#define  TCP_GW_ADD      	10
#define  TCP_MAC_ADD    	14
#define  TCP_PORT_ADD    	20
#define  TCP_TRAPIP_ADD   	24
#define  TCP_TRAPPORT_ADD   28
#define	 TCP_TRAP_PORT		505

#define APP_NO_CHANGE             	21		//无变化
/*********** 程序运行错误代码 **********/
#define APP_OK                      0
#define APP_ERR                     1      // 通用错误
#define APP_ERR_NO_DEV              2      // No Device 无此设备
#define APP_ERR_NOT_INIT            3      // Not Initialized 设备没有初始化
#define APP_ERR_NOT_PERM            4      // Not Permitted 操作不允许
#define APP_ERR_NO_MEM              5      // No Memory 内存空间不足
#define APP_ERR_ARG                 6      // Argument Error 函数参数错误
#define APP_ERR_PARM                7      // Parameter Error 配置参数错误
#define APP_ERR_OS                  8      // OS Error 操作系统的函数调用错误
#define APP_ERR_TIMEOUT             9      // Timeout 等待超时
#define APP_ERR_BUSY                10     // Device Busy 设备忙
#define APP_ERR_MODE                11     // Mode error 模式错误
#define APP_ERR_NACK                12     // Negative ACK 否定应答
#define APP_ERR_OPERFAIL            13     // Operation Fail 操作失败
#define APP_ERR_FORMAT              14     // Format error 格式错误
#define APP_ERR_OTHERS              127    // Others error 其它错误

typedef enum
{
    SET_NULL,
    SET_EN,
} CARD_SET_FLAA;

typedef struct
{
	uint8_t  stus;
	uint8_t  card;
	uint8_t  fun;
	uint8_t  port;
	uint8_t  value;
}SET_PARA_ST;



typedef union
{
	uint16_t word;
	uint8_t  byte[2];
}WORT_ST;
typedef enum
{
    MB_ENOERR,                  /*!< no error. */
    MB_ENOREG,                  /*!< illegal register address. */
    MB_EINVAL,                  /*!< illegal argument. */
    MB_EPORTERR,                /*!< porting layer error. */
    MB_ENORES,                  /*!< insufficient resources. */
    MB_EIO,                     /*!< I/O error. */
    MB_EILLSTATE,               /*!< protocol stack in illegal state. */
    MB_ETIMEDOUT                /*!< timeout error occurred. */
} eMBErrorCode;


typedef enum
{
	MB_RELAY1    = 0,		    /* */
	MB_RELAY2    = 1,			  /*  */
	MB_RELAY3    = 2,		    /* */
	MB_RELAY4    = 3,		    /* */
	MB_SWITCH1    = 10,		    /* */
	MB_SWITCH2    = 11,		    /* */
	MB_CHG_READY = 60,			  /*  */
	MB_MOTOR_CLEAR_ERR = 61,			  /*  */
	MB_CTR_FORCE = 62,			  /*  */
}MB_COILS_HOLDING01;

typedef enum
{
	MB_SOS_KEY=0,		    /* */
	MB_CHG_START=1,			  /*  */
	MB_BUMP_ERR=4,			  /*  */
	MB_CHG_ONOFF=5,			  /*  */

	MB_KEY1=8,		    /* */
	MB_KEY2=9,			  /*  */
	MB_KEY3=10,		    /* */
	MB_KEY4=11,			  /*  */
	MB_KEY5=12,		    /* */
	MB_KEY6=13,			  /*  */
	MB_KEY7=14,		    /* */
	MB_KEY8=15,			  /*  */
}MB_COILS_Discrete02;

typedef enum
{

	MB_REQRPML_L=0,		    /*PRM  left*/
	MB_REQRPML_H=1,			  /*  */
	MB_REQRPMR_L=2,		    /*PRM right  */
	MB_REQRPMR_H=3,			  /*  */


	MB_SOFE_RESER=60,			  /*0xAA55 reset 运行升级程序，设置后恢复出厂程序*/
}MB_REG_HOLDING03;

typedef enum
{

	MB_LED1=0,		    /**/
	MB_LED2=1,			  /**/
	MB_LED3=2,		    /**/
	MB_SD_SIZE=3,			  /**/
	MB_SD_NBR=4,		    /* */

	MB_FUNEN_STUS =7, /*bit0 = IAP  bit1=USE_TCP_SEND bit2 = dog bit3= */

	/***************************************************************
	0 = 出厂程序,
	1 = 升级后程序,
	2 = 文件复制到APP失败
	3 = 升级文件的名称错误
	4 = 升级文件中断向量表偏移地址
	***************************************************************/
	MB_SOFT_STUS =8,
  MB_CAR_TYPE =9,
	/* IP */
	MB_TCP_IP=10,			  /*  */
	MB_TCP_NETMASK=(MB_TCP_IP+2),		    /* */
	MB_TCP_GATEWAY=(MB_TCP_NETMASK+2),			  /*  */
	MB_TCP_MAC =(MB_TCP_GATEWAY+2),
	MB_TCP_PORT = (MB_TCP_MAC+3),
  MB_SOFT_VERSION = (MB_TCP_PORT+1),

	/*数据备份(电机故障代码等)，方便调试*/
	MB_BACK_DATA1   =90,
	MB_BACK_DATA2   =91,
	MB_BACK_DATA3   =92,
	MB_BACK_DATA4   =93,
	MB_BACK_DATA5   =94,
	MB_BACK_DATA6   =95,
}MB_REG_INPUT04;
extern uint16_t mbConnect,mbSofeStus;//0 =link down


void vMBServerTask( void const *argument );
void MB_config(void);


void SETRegCoils1(uint8_t addr,uint8_t *data ,uint8_t len);
void GETRegCoils1(uint8_t addr,uint8_t *data ,uint8_t len);

void SETRegDiscrete2(uint8_t addr,uint8_t *data ,uint8_t len);
void GETRegDiscrete2(uint8_t addr,uint8_t *data ,uint8_t len);

void SETRegHolding3(uint8_t addr,uint16_t *data ,uint8_t len);
void SETOneRegHolding3(uint8_t addr,uint16_t data);
void GETRegHolding3(uint8_t addr,uint16_t *data ,uint8_t len);

void SETRegInput4(uint8_t addr,uint16_t *data ,uint8_t len);
void SETOneRegInput4(uint8_t addr,uint16_t data);
void GETRegInput4(uint8_t addr,uint16_t *data ,uint8_t len);
uint16_t GETOneRegInput4(uint8_t addr);



//网络参数
uint8_t Read_Card_TcpPara(uint16_t addr, uint16_t len, uint8_t *buf);
uint8_t Write_Card_TcpPara(uint16_t addr, uint16_t len, uint8_t *buf);

/****tcp modbus***/

#define REG_INPUT_START         0
#define REG_INPUT_NREGS         128
#define REG_HOLDING_START       0
#define REG_HOLDING_NREGS       128
#define REG_DISCRETE_START      0
#define REG_DISCRETE_NREGS      128
#define REG_COILS_START       	0
#define REG_COILS_NREGS      	128
#define REG_OFFSET     		    1


extern WORT_ST   usRegInputBuf4[REG_INPUT_NREGS];
extern WORT_ST   usRegHoldingBuf3[REG_HOLDING_NREGS];
extern uint8_t   usRegDiscreteBuf2[REG_DISCRETE_NREGS];
extern uint8_t   usRegCoilsBuf1[REG_COILS_NREGS];


#endif
